#ifndef _LYJ_KV_STORE_H_INCLUDE_
#define _LYJ_KV_STORE_H_INCLUDE_
#include "lyj_config.h"

typedef struct lyj_kv_buf_s {
    void* buf;
    size_t len;
}lyj_kv_buf_t;

#define lyj_kv_buf(buf, len) {buf, len}
#define lyj_kv_buf_w(w) lyj_kv_buf(w, sizeof(WCHAR) * wcslen(w))
#define lyj_kv_buf_null lyj_kv_buf(NULL, 0)

typedef struct lyj_kv_store_s lyj_kv_store_t;
typedef void (*lyj_kv_range_callback_f)(void* arg, const lyj_kv_buf_t* key, const lyj_kv_buf_t* value);
#ifdef __cplusplus
extern "C" {
#endif

    lyj_kv_store_t* lyj_kv_store_init(LPCWSTR store_path);
    const char* lyj_kv_store_get_file_path(lyj_kv_store_t* kv);
    const int lyj_kv_store_get_head_file_fd(lyj_kv_store_t* kv);
    const HANDLE lyj_kv_store_get_head_file_handle(lyj_kv_store_t* kv);
    lyj_ret_t lyj_kv_store_put(lyj_kv_store_t* kv, const lyj_kv_buf_t* key, const lyj_kv_buf_t* value);
    lyj_ret_t lyj_kv_store_get(lyj_kv_store_t* kv, const lyj_kv_buf_t* key, lyj_kv_buf_t* value);
    lyj_ret_t lyj_kv_store_delete(lyj_kv_store_t* kv, const lyj_kv_buf_t* key);
    void lyj_kv_store_range_prefix(lyj_kv_store_t* kv, const lyj_kv_buf_t* prefix_key, void* arg, lyj_kv_range_callback_f callback);
    lyj_bool_t lyj_kv_store_range_prefix_exist(lyj_kv_store_t* kv, const lyj_kv_buf_t* prefix_key);

    void lyj_kv_store_lock(lyj_kv_store_t* kv);
    void lyj_kv_store_unlock(lyj_kv_store_t* kv);

    void lyj_kv_store_destroy(lyj_kv_store_t* kv);

#ifdef __cplusplus
}
#endif

#endif // _LYJ_KV_STORE_H_INCLUDE_
